package com.wfs.myapp.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.wfs.myapp.common.ApiResult;
import com.wfs.myapp.entity.domain.dota.DotaEquip;
import com.wfs.myapp.entity.vo.EquipVo;
import com.wfs.myapp.enums.StoreEnum;
import com.wfs.myapp.repository.dota.DotaEquipRepository;
import com.wfs.myapp.service.DotaEquipService;
import com.wfs.myapp.utils.SqeUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class DotaEquipServiceImpl implements DotaEquipService {

    @Autowired
    private DotaEquipRepository dotaEquipRepository;

    @Override
    public ApiResult<?> listByStoreName(String storeName) {
        List<DotaEquip> list = dotaEquipRepository.findAllByStoreName(storeName);
        return ApiResult.success(list);
    }

    @Override
    public ApiResult<?> randomOne() {
        List<DotaEquip> dotaEquips = dotaEquipRepository.listByIsContinues();
        List<Long> idList = dotaEquips.stream().map(DotaEquip::getId).collect(Collectors.toList());
        Integer index = SqeUtil.randomInt(0, idList.size());
        DotaEquip equip = dotaEquips.get(index);
        EquipVo equipVo = new EquipVo();
        this.buildConstitute(equip, equipVo);
        return ApiResult.success(equipVo);
    }

    private EquipVo buildConstitute(DotaEquip equip, EquipVo equipVo){
        if (StringUtils.isNotBlank(equip.getConstitutes())) {
            List<Long> integers = JSONArray.parseArray(equip.getConstitutes(), Long.class);
            List<DotaEquip> allById = dotaEquipRepository.findAllById(integers);
            for (DotaEquip dotaEquip : allById) {
                EquipVo childVo = new EquipVo();
                equipVo.getConstitutes().add(buildConstitute(dotaEquip, childVo));
            }
        }
        BeanUtils.copyProperties(equip, equipVo);
        return equipVo;
    }

    @Override
    public ApiResult<EquipVo> info(Long id) {
        EquipVo vo = new EquipVo();
        DotaEquip equip = dotaEquipRepository.findById(id).get();
        BeanUtils.copyProperties(equip, vo);
        this.buildInfo(equip, vo);
        return null;
    }

    @Override
    public ApiResult<?> storeList() {
        List<String> list = new ArrayList<>();
        for (StoreEnum value : StoreEnum.values()) {
            list.add(value.getName());
        }
        return ApiResult.success(list);
    }

    @Override
    public ApiResult<?> highEquipList() {
        List<DotaEquip> dotaEquips = dotaEquipRepository.listByIsContinues();
        List<EquipVo> collect = dotaEquips.stream().map(dotaEquip -> {
            EquipVo equipVo = new EquipVo();
            BeanUtils.copyProperties(dotaEquip, equipVo);
            equipVo.setConstituteIds(dotaEquip.getConstitutes());
            return equipVo;
        }).collect(Collectors.toList());
        return ApiResult.success(collect);
    }

    private EquipVo buildInfo(DotaEquip equip, EquipVo vo) {
        if (StringUtils.isNotBlank(equip.getConstitutes())) {
            List<Long> constituteList = JSONArray.parseArray(equip.getConstitutes(), Long.class);
            List<EquipVo> list = new ArrayList<>();
            for (Long equipId : constituteList) {
                EquipVo equipIdVo = new EquipVo();
                DotaEquip equip1 = dotaEquipRepository.findById(equipId).get();
                BeanUtils.copyProperties(equip1, equipIdVo);
                buildInfo(equip1, equipIdVo);
                list.add(equipIdVo);
            }
            vo.setConstitutes(list);
        }
        return vo;
    }


}
